#ifndef __PID_H
#define __PID_H

#include "stm32g4xx_hal.h"




#define  S_KP      0.30000f         /* P参数 */
#define  S_KI      0.01000f        /* I参数 */
#define  S_KD      0.10000f        /* D参数 */

#define INTEGRAL_SEPARATION_THRESHOLD 200.0f /* 积分分离阈值，当误差绝对值小于此值时，才进行积分 */

#define PID_MAX_OUTPUT   (float)(6400 * 0.95f)      //定时器的arr为6400，占空比最大为95%

#define PID_I_MAX  (float)(PID_MAX_OUTPUT/S_KI)


/* PID结构体 */
typedef struct
{
    volatile float  target_value;           /* 目标值 */
    volatile float  actual_value;        /* 期望输出值 */
    volatile float  sum_error;           /* 误差累计 */
    volatile float  proportion;         /* 比例常数 P */
    volatile float  integral;           /* 积分常数 I */
    volatile float  derivative;         /* 微分常数 D */
    volatile float  error;              /* Error[1] */
    volatile float  last_error;          /* Error[-1] */
    volatile float  prev_error;          /* Error[-2] */
    volatile float  ing_min;             /* 积分限制 */ 
    volatile float  ing_max;             
    volatile float  out_min;             /* 输出限制 */
    volatile float  out_max;
} PID_TypeDef;



typedef struct
{
    volatile float p_value;
    volatile float i_value;
    volatile float d_value;
    volatile float sum_value;
}pid_inter_t;


// 全局变量extern声明
extern PID_TypeDef g_speed_pid;
extern pid_inter_t g_pid_inter;
extern volatile float g_d_value_max_hold;
extern volatile float g_d_value_min_hold;

/******************************************************************************************/

void pid_init(void);                                                /* PID初始化 */
int32_t pid_ctrl(PID_TypeDef *PID,float Feedback_value);  /* PID控制算法 */
void pid_set_target_value(int32_t target_value);
void pid_reset_integral(void);
void pid_inter_data_reset(void);


#endif
